package com.vhall.component.service.account;


import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vhall.component.entity.account.AccountEntity;
import com.vhall.component.entity.account.dto.ExchangeSessionIdDTO;
import com.vhall.component.entity.account.vo.*;
import com.vhall.component.entity.export.dto.AdminExportCommonQueryCondition;
import com.vhall.component.entity.rbac.vo.RolePermissionConsoleRequestVO;
import com.vhall.component.entity.rbac.vo.RolePermissionConsoleResponseVO;
import com.vhall.component.framework.common.exception.BusinessException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 用户表服务类
 *
 * @author xuyongzheng
 * @date 2021-04-06 19:01:15
 */
public interface AccountService extends IService<AccountEntity> {
    /**
     * 添加账号
     *
     * @param phone    手机号
     * @param username 用户名
     * @param nickname 昵称
     * @param sex      性别
     * @param type     类型
     * @return 账户信息
     */
    AccountEntity add(String phone, String username, String nickname, int sex, int type);


    /**
     * 查询账户列表
     *
     * @param ids 账户id
     * @return 账户列表
     */
    List<AccountVO> listByIds(String ids);

    /**
     * 查询账户列表
     *
     * @param ids 账户id
     * @return 账户列表
     */
    List<AccountVO> listByIds(List<Integer> ids);

    /**
     * 登录接口
     *
     * @param authLoginVO 登录参数
     * @param request     请求
     * @param response    响应
     * @param isCheckCode 是否校验短线验证码
     * @return
     * @throws BusinessException
     */
    AuthLoginRspVO authLogin(AuthLoginVO authLoginVO, HttpServletRequest request, HttpServletResponse response, boolean isCheckCode) throws BusinessException;

    /**
     * 控制台用户登录
     *
     * @param authLoginVO 请求参数
     * @param request     请求信息
     * @param response    响应数据
     * @param isCheckCode 检测验证码 true是 false 否
     * @param name        登录名
     * @return authLoginRspVO
     * @throws BusinessException
     */
    AuthLoginRspVO authLogin(AuthLoginVO authLoginVO, HttpServletRequest request, HttpServletResponse response,
                             boolean isCheckCode, String name) throws BusinessException;

    /**
     * 登录处理
     *
     * @param authLoginVO
     * @param name        用户名
     * @param avatar      头像
     * @param accountType 账号类型
     * @param request     请求信息
     * @param response    响应数据
     * @return AccountDTO
     */
    AccountDTO doLogin(AuthLoginVO authLoginVO, String name, String avatar, Integer accountType, HttpServletRequest request, HttpServletResponse response);

    /**
     * 控制台用户登出
     *
     * @param authLogoutVO 请求参数
     */
    void authLogout(AuthLogoutVO authLogoutVO);

    /**
     * 三方用户登录
     *
     * @param authLoginVO 请求参数
     * @param request     请求信息
     * @param response    响应数据
     * @return ThirdAuthLoginRspVO
     * @throws BusinessException
     */
    ThirdAuthLoginRspVO thirdAuthLogin(ThirdAuthLoginVO authLoginVO, HttpServletRequest request, HttpServletResponse response)
            throws BusinessException;

    /**
     * 游客登录
     *
     * @param authLoginVO 请求参数
     * @param request     请求数据
     * @param response    响应数据
     * @return 游客登录信息
     * @throws BusinessException 业务异常
     */
    VisitorAuthLoginRspVO visitor(VisitorAuthLoginVO authLoginVO, HttpServletRequest request, HttpServletResponse response) throws BusinessException;

    /**
     * 查询ids中的是观众的人的account id
     *
     * @param ids id信息列表
     * @return 有效id
     */
    List<Integer> filterAccountType(List<Integer> ids);


    /**
     * 用户列表
     *
     * @param vo 参数
     * @return 用户分页列表
     */
    AdmAccountListRspVO list(AdmAccountListReqVO vo);

    /**
     * admin更新用户信息
     *
     * @param vo 参数
     * @return 返回值
     */
    Boolean edit(AdmAccountEditReqVO vo);

    /**
     * admin更新用户昵称
     *
     * @param vo        参数
     * @param accountId 账户id
     * @return 返回值
     */
    Boolean editNickName(Integer accountId, AccountEditVO vo);


    /**
     * admin修改用户状态
     *
     * @param vo 参数
     * @return 返回值
     */
    Boolean editStatus(AdmAccountEditStatusReqVO vo);

    /**
     * 针对admin导出用户计算总条数
     *
     * @param userType  用户类型，1=主持人 2=用户
     * @param condition 查询条件
     * @return 总条数
     */
    Integer countUserForAdminExport(Integer userType, AdminExportCommonQueryCondition condition);

    /**
     * 主播通过口令进行房间登录
     *
     * @param vo       请求参数
     * @param request  请求数据
     * @param response 响应数据
     * @return 登录结果
     */
    AuthLoginRspVO loginAnchor(AnchorLoginVO vo, HttpServletRequest request, HttpServletResponse response);

    /**
     * 获取主播菜单权限
     *
     * @param request  请求数据
     * @param response 响应数据
     * @return
     */
    JSONObject permission(Integer accountId, HttpServletRequest request, HttpServletResponse response);

    List<NicknamesVO> getRandomNicknames();

    boolean chooseNickname(ChooseNicknameVO chooseNicknameVO);

    VisitorAuthLoginRspVO visitorUseDeviceId(VisitorAuthLoginVO authLoginVO, HttpServletRequest request, HttpServletResponse response);

    TouristJudgmentRspVO touristJudgment(TouristJudgmentVO touristJudgmentVO);

    /**
     * console管理后台sso 登录接口
     * @param vo 参数
     * @return
     */
    AuthLoginRspVO loginSso(AuthConsoleLoginSsoVO vo);

    List<RolePermissionConsoleResponseVO> rolePermissionConsole(RolePermissionConsoleRequestVO requestVO);

    /**
     * 通过用户 id 获取用户信息列表
     * @param accountIds 用户id 组
     * @return
     */
    List<AccountEntity> getAccountIntoList(List<Integer> accountIds);

    /**
     * 观众端 sso 登录
     * @param vo
     * @param request
     * @param response
     * @return
     */
    AuthLoginRspVO loginWatchSso(WatchLoginSsoVO vo, HttpServletRequest request, HttpServletResponse response);

    /**
     * 使用微信的 ticket 换取国信的 sessionId
     * @param dto
     * @return
     */
    JSONObject exchangeSessionId(ExchangeSessionIdDTO dto);

    /**
     * 切换当前用户的权限
     * @param vo
     * @return
     */
    ChangeAccountRoleResponseVO changeAccountRole(ChangeAccountRoleRequestVO vo);
}
